#define  _CRT_SECURE_NO_WARNINGS 1
//#include "head.h"

// 柔性数组：
// 1. 在结构体中
// 2. 最后一个成员是数组
// 3. 未知大小的数组
// 这个数组就是柔性数组
// 

/*
柔性数组的特点:
    结构中的柔性数组成员前面必须至少一个其他成员，
    sizeof 返回的这种结构大小不包括柔性数组的内存。
    包含柔性数组成员的结构用malloc()函数进行内存的动态分配，并且分配的内存应该大于结构的大小，以适应柔性数组的预期大小。
*/
// 包含柔性数组的结构体应该和动态内存分配的malloc()函数配合使用

//struct S
//{
//    int a;
//    char c;
//    // ...
//    int arr[]; // 柔性数组成员
//    //int arr[0]; --> 也可以
//    // 没指定大小，大小就是未知的
//};
//
//int main()
//{
//    printf("sizeof(S) = %d\n", sizeof(S));
//
//    return 0;
//}



//struct S
//{
//    int a;
//    int arr[0]; 
//};
//
//int main()
//{
//    struct S * ps = (struct S *)malloc(sizeof(struct S) + 5 * sizeof(int));
//    if (ps == NULL)
//    {
//        perror("malloc()");
//        return -1;
//    }
//
//    ps->a = 10;
//    int i = 0;
//    for (i = 0; i < 5; i++)
//    {
//        ps->arr[i] = i + 1;
//        printf("%d ", ps->arr[i]);
//    }
//    printf("\n");
//
//    //空间不够
//    struct S* ps2 = (struct S*)realloc(ps, sizeof(struct S) + 10 * sizeof(int));
//    if (ps2 == NULL)
//    {
//        perror("realloc()");
//        return -1;
//    }
//    else
//    {
//        ps = ps2;   
//        ps2 = NULL;
//    }
//
//    for (i = 0; i < 10; i++)
//    {
//        ps->arr[i] = i + 1;
//        printf("%d ", ps->arr[i]);
//    }
//
//    free(ps);
//    ps = NULL;
//
//    return 0;
//}


// 另一种方式：
//struct S
//{
//    int n;
//    int* arr;
//};
//
//int main()
//{
//    struct S* ps = (struct S*)malloc(sizeof(struct S)); //--> 整个结构体的空间，包括int* arr
//    if (ps == NULL)
//    {
//        perror("malloc1");
//        return -1;
//    }
//
//    ps->n = 10;
//    ps->arr = (int*)malloc(5 * sizeof(int));
//    if (ps->arr == NULL)
//    {
//        perror("malloc2");
//        return -1;
//    } 
//    int i = 0;
//    for (i = 0; i < 5; i++)
//    {
//        ps->arr[i] = i + 1;
//        printf("%d ", ps->arr[i]);
//    }
//
//    //空间不够
//    int* ptr = (int*)realloc(ps->arr, 10 * sizeof(int));
//    if (ps->arr == NULL)
//    {
//        perror("realloc ps");
//        return -1;
//    }
//    else
//    {
//        ps->arr = ptr;
//        ptr = NULL;
//    }
//
//    for (i = 0; i < 10; i++)
//    {
//        ps->arr[i] = i + 1;
//        printf("%d ", ps->arr[i]);
//    }
//
//
//    //释放
//    free(ps->arr);
//    ps->arr = NULL;
//
//    free(ps);
//    ps = NULL;
//
//    return 0;
//}


// 柔性数组更方便，好处：
// 方便内存释放
// 有利于提高访问速度